/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.controllers;

import espe.ccsoft.controllers.utils.JsfUtil;
import espe.ccsoft.controllers.utils.Mensajes;
import espe.ccsoft.controllers.utils.PaginationHelper;
import espe.ccsoft.controllers.utils.Validaciones;
import espe.ccsoft.dao.RolDao;
import espe.ccsoft.dao.SocioDao;
import espe.ccsoft.models.Rol;
import espe.ccsoft.models.Socio;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author Carlos Guerrero
 */
@ManagedBean
@RequestScoped
public class SocioController {

    private File file;
    private Socio socio;
    private PaginationHelper pagination;
    private SocioDao socioDao;
    private int selectedItemIndex;
    private DataModel items = null;
    String realPath = "";
    Mensajes mensaje;
    Validaciones validaciones;

    public SocioController() {
        mensaje = new Mensajes();
        validaciones = new Validaciones();
    }
        
    public Socio getSelected() {
        if (socio == null) {
            socio = new Socio();
            selectedItemIndex = -1;
        }
        return socio;
    }

    public SocioDao getSocioDao() {
        socioDao = new SocioDao();
        return socioDao;
    }

    public final String cargarDetalleSocio(Socio mSocio) throws Exception {
        socio = getSocioDao().findByPK(mSocio.getId());
        return "Detalle";
    }

    public final String cargarModificarSocio(Socio mSocio) throws Exception {
        socio = getSocioDao().findByPK(mSocio.getId());
        return "Modificar";
    }

    public byte[] cargarImagen(Socio socio) throws IOException {
        try {
            byte[] data = socio.getFoto().getBytes(1, (int) socio.getFoto().length());
            return data;
        } catch (SQLException ex) {
            Logger.getLogger(Socio.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public StreamedContent getImage() throws IOException, Exception {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {

            String socio_id = context.getExternalContext().getRequestParameterMap().get("socioId");
            Socio socioTmp = getSocioDao().findByPK(Integer.parseInt(socio_id));
            return new DefaultStreamedContent(new ByteArrayInputStream(cargarImagen(socioTmp)));
        }
    }

    public final String crearSocio() throws Exception {
        //Validaciones
        if (!validaciones.validarCedula(socio.getRuc())) {
            mensaje.addMessageSuccefull("Cédula incorrecta!", "Por favor ingrese una cédula correcta.");
            return null;
        }

        if (!socio.getEmail().equals("")) {
            if (!validaciones.validateEmail(socio.getEmail())) {
                mensaje.addMessageSuccefull("Email incorrecto!", "Por favor ingrese una email correcto.");
                return null;
            }
        }
        
        //Permite Obtener la Ruta real de la imagen SinFoto
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        realPath = (String) servletContext.getRealPath("/img/sinFoto.jpg");

        //
        SocioDao dao = new SocioDao();
        Socio socioTmp = dao.findByRUC(socio.getRuc());
        socio.setRutaFoto(realPath);
        try {
            if (socioTmp == null) {
                dao.insert(socio);
                mensaje.addMessageSuccefull("Registro exitoso!", "El socio fue registrado correctamente.");
                return "index";
            } else {
                mensaje.addMessageError("Registro fallido!", "El socio ya se encuentra registrado.");
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }

    public String modificarSocio() throws Exception {
        SocioDao dao = new SocioDao();
        dao.update(socio);
        mensaje.addMessageSuccefull("Modificación exitosa!", "Socio modificado con éxito.");        
        return "index";

    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }
    
    public List<Socio> getSociosDisponibles() throws Exception{
        return getSocioDao().findAll();
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    try {
                        return getSocioDao().findAll().size();
                    } catch (Exception ex) {
                        return 0;
                    }
                }

                @Override
                public DataModel createPageDataModel() {
                    try {
                        return new ListDataModel(getSocioDao().findAll());
                    } catch (Exception ex) {
                        return new ListDataModel();
                    }
                }
            };
        }
        return pagination;
    }

    public final String cargarCrearSocio() {
        socio = new Socio();
        selectedItemIndex = -1;
        return "Crear";
    }
    
    public final String cargarModificarDetalleSocio(int id_socio) throws Exception {
        socio = getSocioDao().findByPK(id_socio);
        return "Modificar";
    }

    public final String cargarDetalleModificarSocio(int id_socio) throws Exception {
        socio = getSocioDao().findByPK(id_socio);
        return "Detalle";
    }

}
